跳到主要内容

Go 编译时替换函数 supermonkey

使用方式:

package main

import (
"fmt"

sm "github.com/cch123/supermonkey"
)

func main() {
fmt.Println("original function output:")
heyHeyHey()

patchGuard := sm.PatchByFullSymbolName("main.heyHeyHey", func() {
fmt.Println("please be polite")
})
fmt.Println("after patch, function output:")
heyHeyHey()

patchGuard.Unpatch()
fmt.Println("unpatch, then output:")
heyHeyHey()
}

//go:noinline
func heyHeyHey() {
fmt.Println("fake")
}

输出时:

original function output:
fake
after patch, function output:
please be polite
unpatch, then output:
fake

确保有 nm 命令,运行时得包装项目没有被内联优化了

go run -gcflags="-l" yourfile.go

1.17 版本

go run -ldflags="-s=false" -gcflags="-l" main.go

References